#include <iostream>
#include <vector>
#include <bitset>
#include <algorithm> // For std::vector::resize in some compilers if needed

// 常量定义，注意 bitset 的大小是编译时常量
const int MAXN = 505; // 题目 N <= 500，数组开大一点以防万一，且 bitset 从0开始索引，所以501或更大

int n;
int a[MAXN][MAXN];       // a[cow_idx][preference_rank] = gift_id
std::bitset<MAXN> f[MAXN]; // f[i] 是一个 bitset，f[i][j] = 1 表示奶牛 i 能到达奶牛 j

int main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);

    std::cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            std::cin >> a[i][j];
        }
    }

    // 初始化 f 数组 (建图)
    // f[i][k] = 1 表示奶牛 i 愿意接受礼物 k (即奶牛 k 手中的礼物)
    for (int i = 1; i <= n; i++) { // 对于每一头奶牛 i
        for (int j = 1; j <= n; j++) { // 遍历奶牛 i 愿望单中的礼物
            // a[i][j] 是奶牛 i 第 j 喜欢的礼物
            // 将其设为1，表示奶牛 i 愿意接受礼物 a[i][j]
            f[i][a[i][j]] = 1;

            // 如果当前考虑的礼物 a[i][j] 正是奶牛 i 自己原有的礼物 i，
            // 那么对于愿望单中排在礼物 i 之后、更不被喜欢的礼物，奶牛 i 肯定不会接受。
            if (a[i][j] == i) {
                break;
            }
        }
    }

    // 计算传递闭包 (Floyd-Warshall 算法，用 bitset 优化)
    // f[i][j] 的含义变为：存在一条从奶牛 i 到奶牛 j 的路径
    for (int k = 1; k <= n; k++) {         // 中间节点 k
        for (int i = 1; i <= n; i++) {     // 起始节点 i
            // 如果从 i 可以到达 k (即 f[i][k] 为 1)
            if (f[i][k]) {
                // 那么 i 也可以到达所有 k 能到达的节点
                // f[i] = f[i] OR f[k]
                f[i] |= f[k];
            }
        }
    }

    // 为每头奶牛找到最好的礼物
    for (int i = 1; i <= n; i++) {         // 对于奶牛 i
        for (int j = 1; j <= n; j++) {     // 按照奶牛 i 的偏好顺序，考察礼物 G = a[i][j]
            // G 是奶牛 i 正在考虑的目标礼物。礼物 G 最初属于奶牛 G (即奶牛 a[i][j])。
            // 条件: 奶牛 i 能到奶牛 G 并且 奶牛 G 也能到奶牛 i
            // f[i][a[i][j]] 表示从 i 能否到达 G (礼物 a[i][j] 的原主人)
            // f[a[i][j]][i] 表示从 G 能否到达 i
            if (f[i][a[i][j]] && f[a[i][j]][i]) {
                std::cout << a[i][j] << '\n';
                break; // 找到了，对于奶牛 i，这是最好的可能礼物
            }
        }
    }

    return 0;
}